#pragma once

#include <iostream>
#include <string>
#include <memory>
#include <ctime>
#include <unistd.h>
#include <unordered_map>

class Session
{
public:
    Session(const std::string &username, const std::string &status)
        : _userName(username), _status(status)
    {
        _createTime = time(nullptr); // 获取时间戳就行了，后面实际需要，就转化就转换一下
    }
    ~Session()
    {
    }

public:
    // Session对象的一些属性
    std::string _userName;
    std::string _status;
    uint64_t _createTime;
    // uint64_t _timeOut;
    // int active;
};


using session_ptr = std::shared_ptr<Session>;

class SessionManager
{
public:
    SessionManager()
    {
        srand(time(nullptr) ^ getpid());
    }

    // 添加session对象，并返回 sessionID（用户发起请求）
    std::string AddSession(session_ptr s)
    {
        // 这里采用随机数+时间戳形成一个随机ID，实际有形成sessionID的库，如boost uuid库，或者其他第三方库
        uint32_t randomID = rand() + time(nullptr);
        std::string sessionID = std::to_string(randomID);
        // 添加session对象
        _sessions.insert(std::make_pair(sessionID, s));
        return sessionID;
    }

    // 根据sessionID获取session对象（服务器查询处理时）
    session_ptr GetSession(const std::string &sessionID)
    {
        if (_sessions.find(sessionID) == _sessions.end())
            return nullptr;
        return _sessions[sessionID];
    }

    ~SessionManager()
    {
    }

private:
    std::unordered_map<std::string, session_ptr> _sessions;
};

